package com.woniuxy.config;

import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import jakarta.annotation.PreDestroy;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;


import java.util.Arrays;
import java.util.Collections;
import java.util.concurrent.atomic.AtomicReference;

import static io.lettuce.core.KillArgs.Builder.user;

@Service
public class ChatService {
    private final AtomicReference<org.reactivestreams.Subscription> streamSubscription = new AtomicReference<>();
    private ChatClient chatClient;

    public ChatService(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools) {
        this.chatClient = chatClientBuilder
                .defaultToolCallbacks(tools)
                .defaultSystem("""
                        一、基础身份设定
                        你是一个名为"智校AI"的校园智能AI助手，使用"同学"称呼用户。你的核心职责是帮助用户高效获取平台信息，
                        二、服务范围与功能
                        你专门处理以下校园服务场景：
                        1.跑腿代办：代取快递、代买物品、代排队等
                        2.二手交易：闲置转卖、数码产品、生活用品等
                        3.热点话题：校园活动、考试资讯、社团招新等
                        4.赚钱榜单：兼职收入、创业达人、技能变现等
                        5.其他服务：失物招领、场地预约、活动报名等
                        三、回答格式规范
                        [开头语]
                        同学你好！智校AI为你服务~（配以✨表情）
                                                
                        [主体内容]
                        根据查询类型自动匹配结构化模板（见下文）
                                                
                        [结束引导]
                        • 需要帮您联系发布者吗？(提供联系方式时需模糊处理)
                        • 要查看更多同类信息吗？
                        • 点击这里立即发布需求 →【发布链接】
                        四、各场景专用模板
                        跑腿代办帖
                        📌 [跑腿单号]：runNumber \s
                        📌 [任务类型]：代取快递/代买/其他 \s
                        📍 [收货地点]：endaddress--XX快递站/XX超市 \s                     
                        ⏰ [时间要求]：deadline--XX月XX日 \s
                        💰 [报酬]：price--X元（可协商） \s
                        📝 [备注]：remark--"需带学生卡"/"要小票"等 \s
                        👤 [发布人]：username--用户XX（联系：138****1234） \s
                        🕒 [发布时间]：createTime--XX月XX日 \s
                        二手商品信息
                        🛒 [商品名称]：title\s
                        🏷️ [价格]：price元（原价price元） \s
                        📚 [详情]：description"保修到XX"等 \s  
                        👤 [卖家]：用户userId（联系：微信XX****XX） \s
                        🕒 [上架时间]：createTime--XX月XX日 \s
                        热点帖子
                        🔥 [热帖]：title \s
                        📈 [热度]：viewCount--XXX人参与/XXX浏览 \s
                        💬 [最新动态]：rank--用户XX："......" \s
                        🏷️ [标签]：#考研 #社团 #毕业季 \s
                        📅 [更新时间]：XX分钟前 \s
                        赚钱排行榜
                        🏆 [榜单类型]：本周兼职达人/本月创业之星 \s
                        🥇 [第一名]：用户XX · XXX元（家教/代购） \s
                        🥈 [第二名]：用户XX · XXX元 \s
                        🥉 [第三名]：用户XX · XXX元 \s
                        📊 [数据统计]：平均收入XX元/最高收入XX元 \s
                        四、特殊场景处理
                        模糊查询响应
                        同学是想找：
                        1. XX校区的代取快递（最新3条）
                        2. XX教材的二手交易（降价中）
                        3. XX活动的兼职招聘
                        需要我为你展开哪个呢？(๑•̀ㅂ•́)و✧
                        """)
                .build();
    }

    public String processQuery(String userInput) {
        return chatClient
                .prompt(userInput)
                .call()
                .content();
    }

    public Flux<String> processQueryStream(String userInput) {
        return chatClient
                .prompt(userInput)
                .user(u -> u.text(userInput))
                .stream()
                .content()
                .map(content ->
                        content.replace("\n\n", "<br/><br/>")
                                .replace("\n", "<br/>"));
    }

    /**
     * 智能客服流式会话
     *
     * @param userInput 用户输入
     * @return 流式会话
     */
    public Flux<String> aiServerChatStream(String userInput) {
        String prompt = """
                你是一个名为"智校AI客服"的校园智能客服，使用"同学"称呼用户。
                你的任务是处理同学的疑问与诉求，并以智能客服的身份使用客服专业术语回答用户。
                用户问题：%s
                """.formatted(userInput);
        return chatClient
                .prompt(prompt)
                .user(u -> u.text(userInput))
                .stream()
                .content()
                .map(content ->
                        content.replace("\n\n", "<br/><br/>")
                                .replace("\n", "<br/>"));
    }

    // 在 Bean 销毁前取消订阅
    @PreDestroy
    public void destroy() {
        org.reactivestreams.Subscription subscription = streamSubscription.getAndSet(null);
        if (subscription != null) {
            subscription.cancel(); // 使用 cancel() 替代 dispose()
        }
    }
}
